package front;

import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.IOException;

import java.util.ArrayList;
import java.util.List;
import java.net.Socket;
import java.net.UnknownHostException;

import javax.faces.model.SelectItem;

import front.Libro;

public class Servicio {
	private String ipServerFrontEnd = "localhost";
	private int portFrondEnd = 1235;
    private ObjectInputStream flujoEntradaFrondEnd;
    private ObjectOutputStream flujoSalidaFrondEnd;
    private Socket socketFrondEnd;
   
    public Servicio() throws UnknownHostException, IOException  {
        	this.socketFrondEnd = new Socket(ipServerFrontEnd,portFrondEnd);
            System.out.println("CONECTADO AL HOST");
            this.flujoSalidaFrondEnd = new ObjectOutputStream(socketFrondEnd.getOutputStream());
            this.flujoEntradaFrondEnd = new ObjectInputStream(socketFrondEnd.getInputStream());
    }     
    
    private Object recieveFrom(ObjectInputStream flujo) throws IOException, ClassNotFoundException {
		Object msg = flujo.readObject();
        System.out.println("MENSAJE RECIBIDO!!!!!!!!!");
        return msg;
    }
    
    private void sendTo(ObjectOutputStream flujo, String mensaje) throws IOException {
        flujo.writeUTF(mensaje);
        flujo.flush();
    }
    
	private void desconectar() throws IOException {
        flujoEntradaFrondEnd.close();
        flujoSalidaFrondEnd.close();
        socketFrondEnd.close();
    }
	
	private List<Libro> buildLibroList(List<String> listaIn) {
		List<Libro> listaOut = new ArrayList<Libro>();
		for(String serLibro : listaIn) {
			Libro libro = new Libro();
			libro.unserialize(serLibro);
			listaOut.add(libro);
		}
		if (listaOut.isEmpty()) {
			Libro libro = new Libro();
			libro.setCosto(1);
			libro.setId_libro(1);
			libro.setSeleccionado(true);
			libro.setStock(1);
			libro.setTema("cualuqiera");
			libro.setTitulo("cualuqiera");
			listaOut.add(libro);
		}
		return listaOut;	
	}

	public List<String> getListaTemas() throws IOException, ClassNotFoundException {
        sendTo(flujoSalidaFrondEnd,"listaTemas");
        List<String> msg = (List<String>) recieveFrom(flujoEntradaFrondEnd);
		return msg;
	}

	public List<Libro> getListaLibros() throws IOException, ClassNotFoundException {
        sendTo(flujoSalidaFrondEnd,"listaLibros");
        List<String> inputMsj = (List<String>) recieveFrom(flujoEntradaFrondEnd);
		return buildLibroList(inputMsj);
	}
	
	public List<Libro> getListaLibrosTema(String bookSubject) throws IOException, ClassNotFoundException {
        sendTo(flujoSalidaFrondEnd,"listaXtema|" + bookSubject);
        List<String> inputMsj = (List<String>) recieveFrom(flujoEntradaFrondEnd);
		return buildLibroList(inputMsj);
	}
	
	public List<Libro> getListaLibrosTitulo(String bookTitle) throws IOException, ClassNotFoundException {
        sendTo(flujoSalidaFrondEnd,"listaXtitu|" + bookTitle);
        List<String> inputMsj = (List<String>) recieveFrom(flujoEntradaFrondEnd);
		return buildLibroList(inputMsj);
	}

	public List<Libro> getListaLibrosTemaTitulo(String bookSubject, String bookTitle) throws IOException, ClassNotFoundException {
        sendTo(flujoSalidaFrondEnd,"listaXtite|" + bookSubject + "|" + bookTitle);
        List<String> inputMsj = (List<String>) recieveFrom(flujoEntradaFrondEnd);
		return buildLibroList(inputMsj);
	}

	public List<String> comprarLibro(String bookId) throws IOException, ClassNotFoundException {
        sendTo(flujoSalidaFrondEnd,"buyBook|" + bookId);
        List<String> inputMsj = (List<String>) recieveFrom(flujoEntradaFrondEnd);
		return inputMsj;
	}
}



